// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 12.2.5
description: >
    computed property setters can call super methods
---*/

function Test() {
    function ID(x) {
      return x;
    }

    var value;
    var proto = {
      m(name, v) {
        value = name + ' ' + v;
      }
    };
    var object = {
      set ['a'](v) { super.m('a', v); },
      set [ID('b')](v) { super.m('b', v); },
      set [0](v) { super.m('0', v); },
      set [ID(1)](v) { super.m('1', v); },
    };

    Object.setPrototypeOf(object, proto);

    object.a = 2;
    assert.sameValue(value, 'a 2', "The value of `value` is `'a 2'`, after executing `object.a = 2;`");
    object.b = 3;
    assert.sameValue(value, 'b 3', "The value of `value` is `'b 3'`, after executing `object.b = 3;`");
    object[0] = 4;
    assert.sameValue(value, '0 4', "The value of `value` is `'0 4'`, after executing `object[0] = 4;`");
    object[1] = 5;
    assert.sameValue(value, '1 5', "The value of `value` is `'1 5'`, after executing `object[1] = 5;`");
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
